package Test07;

//多线程

/*
需求:完成生产者和消费者(等待唤醒机制)的代码
     实现线程轮流交替执行的效果
 */
public class Test13 {
    public static void main(String[] args) {

        //创建线程
        Cook13 c = new Cook13();
        Foodie13 f = new Foodie13();

        //设置名字
        c.setName("厨师");
        f.setName("吃货");

        //开启线程
        c.start();
        f.start();
    }
}

//生产者(厨师)
class Cook13 extends Thread {

    @Override
    public void run() {
        /*
        四步套路：
        1、循环
        2、同步代码块
        3、判断共享数据是否到了末尾(到了末尾)
        4、判断共享数据是否到了末尾(没有到末尾，执行核心逻辑)
         */

        while (true) {
            synchronized (Desk13.lock) {
                if (Desk13.count == 0) {
                    break;
                } else {
                    //判断桌子上是否有食物
                    if (Desk13.foodFlag == 1) {
                        //如果有，就等待
                        try {
                            Desk13.lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    } else {
                        //如果没有，就制作食物
                        System.out.println("厨师做了一碗面条");
                        //修改桌子上的食物状态
                        Desk13.foodFlag = 1;
                        //叫醒等待的消费者开吃
                        Desk13.lock.notifyAll();
                    }
                }
            }
        }
    }
}

//消费者(吃货)
class Foodie13 extends Thread {

    @Override
    public void run() {
        /*
        四步套路：
        1、循环
        2、同步代码块
        3、判断共享数据是否到了末尾(到了末尾)
        4、判断共享数据是否到了末尾(没有到末尾，执行核心逻辑)
         */

        while (true) {
            synchronized (Desk13.lock) {
                if (Desk13.count == 0) {
                    break;
                } else {
                    //先判断桌子上是否有面条
                    if (Desk13.foodFlag == 0) {
                        //如果没有，就等待
                        try {
                            Desk13.lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    } else {
                        //把吃的数量减1
                        Desk13.count--;
                        //如果有，就开吃
                        System.out.println("吃货在吃面条，还能在吃" + Desk13.count + "碗！！！");
                        //吃完后，唤醒厨师继续做
                        Desk13.lock.notifyAll();
                        //修改桌子的状态
                        Desk13.foodFlag = 0;
                    }
                }
            }
        }
    }
}

//第三者(桌子)
//作用：控制生产者和消费者的执行
class Desk13 {

    /*
    作用：控制生产者和消费者的执行
     */

    //是否有面条：   0：没有面条    1：有面条
    public static int foodFlag = 0;

    //总个数
    public static int count = 10;

    //锁对象
    public static Object lock = new Object();
}
